# -*- coding: utf-8 -*-
'''
Created on 08/03/2011

@author: cgaray
@contact: cdaniel.py@gmail.com
@summary : Clase de manejo de interaccion con base de datos ORACLE
'''

#importamos los modulos necesarios
import cx_Oracle as libreria
from CdgPyPersistencia.bases.ConectorBase import ConectorBase


class OracleUtiles(ConectorBase):
    '''
    clase de manejo de interaccion con base de datos ORACLE
    '''
    
    NOMBRE_CLASE = "OracleUtiles"
    
    __oCursor    = libreria.Cursor
    
    
    
    def __init__(self, cUsuarioParam, cContrasenaParam, cServidorParam
                        , nPuertoParam, cServicioParam):
        '''
        inicializador de la clase
        '''
        
        #inicializamos la clase base
        super(OracleUtiles, self).__init__(cUsuarioParam, cContrasenaParam, cServidorParam
                                           , "", nPuertoParam, cServicioParam)
        
        
    
    
    def lConectar(self):
        '''Metodo de conexion al motor de base de datos'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lConectar()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos abrir la conexion
        try:
            __oDsn           = libreria.makedsn(self._cServidor, self._nPuerto, self._cServicio)
            self.__oConexion = libreria.connect(self._cUsuario, self._cContrasena, __oDsn)
            self.__oCursor   = self.__oConexion.cursor()
            
            #resultado del metodo - #imprimimos la representacion de la conexion
            lResultado = [1, self.__str__()]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lDesconectar(self):
        '''Metodo de desconexion del motor de base de datos'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lDesconectar()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos cerrar la conexion
        try:
            self.__oConexion.close()
            
            #resultado del metodo
            lResultado = [1, "Ok"]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lGet_cursor(self):
        '''Devuelve un cursor'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lGet_cursor()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos abrir el cursor
        try:
            #establecemos el resultado
            lResultado = [1, self.__oConexion.cursor()]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lEjecutar_sentencia(self, cSentenciaSQL, dicValores):
        '''ejecuta una sentencia y devuelve el resultado de la ejecucion'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lEjecutar_sentencia()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos ejecutar la sentencia sql
        try:
            cSentenciaSQL = cSentenciaSQL % dicValores
            self.__oCursor.prepare(cSentenciaSQL)
            self.Mostrar_sql(cSentenciaSQL)
            self.__oCursor.execute(None)
            
            #resultado del metodo
            lResultado = [1, "Ok"]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lEjecutar_consulta(self, cConsultaSQL, dicValores):
        '''ejecuta una consulta y devuelve el resultado de la ejecucion'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lEjecutar_consulta()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos ejecutar la sentencia sql
        try:
            cConsultaSQL = cConsultaSQL % dicValores
            self.__oCursor.prepare(cConsultaSQL)
            self.Mostrar_sql(cConsultaSQL)
            self.__oCursor.execute(None)
            
            #resultado del metodo
            lResultado = [1, self.__oCursor.fetchall()]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lEjecutar_procedimiento(self, cProcedimiento, dicParametros):
        '''ejecuta el procedimiento y devuelve el resultado de la ejecucion'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lEjecutar_procedimiento()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos ejecutar la sentencia sql
        try:
            self.Mostrar_sql(cProcedimiento)
            self.__oCursor.callproc(cProcedimiento, dicParametros)
            
            #resultado del metodo
            lResultado = [1, self.__oCursor.fetchall()]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def Set_autocomit(self, bAutocommit):
        '''Establece el modo de confirmacion de transacciones'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".Set_autocomit()"
        
        try:
            self.__oConexion.autocommit = bAutocommit
            
        except BaseException, oError:
            #en caso de error
            print "Error " + NOMBRE_METODO + ": " + str(oError)
            
        
        pass;
        
    
    
    def lIniciar_transaccion(self):
        '''Inicia una Transaccion'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lIniciar_transaccion()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos iniciar la transaccion
        try:
            self.__oConexion.begin()
            
            #resultado del metodo
            lResultado = [1, "Ok"]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lConfirmar_transaccion(self):
        '''Confirma una Transaccion'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lConfirmar_transaccion()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos confirmar la transaccion
        try:
            self.Mostrar_sql("COMMIT")
            self.__oConexion.commit()
            
            #resultado del metodo
            lResultado = [1, "Ok"]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lRevertir_transaccion(self):
        '''Revierta una Transaccion'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lRevertir_transaccion()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Ejecutado"]
        
        #intentamos revertir la transaccion
        try:
            self.Mostrar_sql("ROLLBACK")
            self.__oConexion.rollback()
            
            #resultado del metodo
            lResultado = [1, "Ok"]
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
            
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    